package com.atguigu.gmall.all.controller.api;

import com.atguigu.gmall.cart.client.feign.CartFeignClient;
import com.atguigu.gmall.common.util.AuthContextHolder;
import com.atguigu.gmall.model.cart.CartInfo;
import com.atguigu.gmall.order.client.OrderFeignClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author wk
 * @create 2021-09-06 20:36
 * 加入购物车
 */
@Controller
public class CartController {
    @Autowired
    private CartFeignClient cartFeignClient;

    // http://cart.gmall.com/addCart.html?skuId=' + this.skuId + '&skuNum=' + this.skuNum
    @GetMapping("/addCart.html")
    // RedirectAttributes 可以在重定向时将参数携带到重定向到的位置
    public String addCart(Long skuId, Integer skuNum, RedirectAttributes redirectAttributes,
                          HttpServletRequest request) {
        // 获取用户id
        /*String userId = AuthContextHolder.getUserId(request);
        String userTempId = AuthContextHolder.getUserTempId(request);*/
        // 不适用
        // 在进行服务之间的远程调用时 可能部分微服务都会需要这个用户id
        // 可以配置一个拦截器 当所有的微服务在进行远程调用时
        // 如果需要用户id先实例化拦截器  然后通过拦截器携带用户id 可以一劳永逸
        // 在主启动类中已经实例化

        // 只添加 不返回数据
        cartFeignClient.addCart(skuId, skuNum);
        redirectAttributes.addAttribute("skuId", skuId);
        redirectAttributes.addAttribute("skuNum", skuNum);
        // 重定向到返回添加数据成功页面
        return "redirect:http://cart.gmall.com/toCart.html";
    }

    /**
     * 1.将添加和显示成功 分开 可以避免 添加成功后刷新页面 导致数据重新添加
     * 故而 当添加完成后 使用重定向 到添加成功页面
     * 添加只负责添加 同时向数据库和缓存中添加数据
     * 添加成功只负责将添加的数据信息以及数量回显出来
     */
    @GetMapping("/toCart.html")
    public String toAddCart(Long skuId, Integer skuNum, Model model) {
        // 返回数据添加成功页面
        CartInfo cartInfo = cartFeignClient.findCartInfo(skuId);
        cartInfo.setSkuNum(skuNum); // 页面添加几件 则显示几件 而不是从缓存中获取
        model.addAttribute("cartInfo", cartInfo);
        System.out.println("添加到购物车成功");
        return "cart/addCart";
    }

    // http://cart.gmall.com/cart.html
    // 点击去购物车结算按钮跳转去购物车页面
    @GetMapping("/cart.html")
    public String cart() {
        return "cart/index";
    }

}
